//
//  HMUserAccountViewModel.swift
//  Weibo22
//
//  Created by Apple on 16/12/3.
//  Copyright © 2016年 Apple. All rights reserved.
//

import UIKit
//  OAuth登陆页面的网络请求的封装
class HMUserAccountViewModel: NSObject {

    //  单例全局访问点
    static let sharedUserAccount: HMUserAccountViewModel = HMUserAccountViewModel()
    
    //  用户账号模型
    var userAccount: HMUserAccount? {
        return HMUserAccount.loadUserAccount()
    }
    
    //  判断是否登陆的标记
    var isLogin: Bool {
        return accessToken != nil
    }
    
    //  获取accesstoken的逻辑
    /*
        1. 判断accesstoken是否为nil, 如果为nil, 直接返回nil
        2. 如果不为nil, 判断accesstoken的过期时间是否大于我们的当前时间,如果过期时间大于我们的当前时间表示没有过期, 返回accesstoken, 否则 表示过期了, 那么返回nil
     */
    var accessToken: String? {
    
        guard let token = userAccount?.access_token else {
            return nil
        }
        //  代码执行到此表示token不为nil
        //  比较那个那个时间大,如果是降序表示过期时间大于我们的当前时间
        if userAccount?.expiresDate?.compare(Date()) == ComparisonResult.orderedDescending {
            return token
        
        } else {
        
            //  过期了
            return nil
        }
        
        
    
    }
    
    
    //  通过code获取accesstoken
    //  private 表示更加私有,在扩展里面也不能访问 swift 3.0
    //  fileprivate 表示私有,但是可以在扩展里面访问
    func requestAccessToken(code: String, callBack: @escaping (Bool)->()) {
        
        HMNetworkTools.sharedTools.requestAccesstoken(code: code, callBack: {(response, error) -> () in
            //  判断请求是否有问题
            if error != nil {
                print(error!)
                callBack(false)
                return
            }
            //  代码执行到此,表示请求成功
            
            let dic = response as! [String: Any]
            
            //  把字典转场模型
            let userAccount = HMUserAccount(dic: dic)
            
            
            //  获取到用户id以后,获取对应的用户信息
            self.requestUserInfo(userAccount: userAccount, callBack: callBack)
            
        })
        
        
    }
    
    //  通过用户id和accesstoken获取用户信息
    private func requestUserInfo(userAccount: HMUserAccount, callBack: @escaping (Bool)->()) {
        //
        let accessToken = userAccount.access_token!
        let userId = userAccount.uid
        
        HMNetworkTools.sharedTools.requestUserInfo(accessToken: accessToken, uid: userId, callBack: {(response, error) -> () in
            if error != nil {
                print(error!)
                callBack(false)
                return
            }
            
            //  代码执行到此,表示请求成功
            
            
            
            let dic = response as! [String: Any]
            
            let name = dic["name"]
            let avatar_large = dic["avatar_large"]
            //  给对象里面的属性赋值
            userAccount.name = name as? String
            userAccount.avatar_large = avatar_large as? String
            
            //  登陆成功了,需要归档属性
            userAccount.saveUserAccount()
            
            //  代码执行到此表示登陆成功
            callBack(true)
            
        })
    }

    
}
